<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>12345</title>
</head>

<body>
<script type="text/javascript">
/*    浏览器执行JS程序的时候，分两步
    1.预解析 在代码解读之前发生，相当于一个‘仓库’，放一些东西，比如var function,参数等。
    预解析是变量都是未定义的，函数则是整个函数块
    预解析时遇到重名的，会覆盖，变量和函数，留函数；函数与函数，留后面解析的。
    当代码在一个环境中执行，会创建对象的一个作用域链，是域就要解析。
    2.执行代码
    代码自上而下，从左到右执行，读到表达式时，预解析仓库中的东西发生改变
    */

    window.onload=function(){
        Foo.getName();//2
        getName();//4
        Foo().getName();//1 此处实际上将外层作用域内的getName函数修改了 Window.getName();
        getName();//1
        new Foo.getName();//2
        new Foo().getName();//3
        new new Foo().getName();//3


    }
    function Foo(){//第一行
        getName=function (){console.log(1);};
        return  this;
    }
    Foo.getName=function (){console.log(2);};//第5行
    Foo.prototype.getName=function (){console.log(3);};//第6行
    var getName=function(){console.log(4);};//第7行
    function getName(){ console.log(5);};//第8行
</script>
</body>
</html>